package br.com.conciliador.download.apresentacao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletResponse;

import br.com.conciliador.download.negocio.DownloadNgc;
import br.com.conciliador.download.vo.DownloadVo;
import br.com.conciliador.download.vo.filtro.FiltroDownloadVo;
import br.com.conciliador.util.Download;
import br.com.conciliador.util.jsf.AbstractBean;
import br.com.conciliador.util.jsf.JSFUtil;
import br.com.conciliador.util.negocio.DominioNgc;
import br.com.conciliador.util.vo.DominioVo;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;

public class DownloadBean extends AbstractBean<DownloadVo, DownloadNgc>
{

   private List<DominioVo> listaSituacao;
   
   private List<DominioVo> listaTipoArquivo;
   
   public DownloadBean()
   {
      super(DownloadNgc.getInstancia());
      this.ACTION_SEARCH = "download";
      this.pageTitle = "titulo_download";
   }
   
   @Override
   public String preparaPesquisar()
   {
      String retorno = super.preparaPesquisar();
      
      this.getSearchObject().setFiltro(new FiltroDownloadVo());
      
      return retorno;
   }
   
   @Override
   protected int getJoinPesquisar()
   {
      int join = DownloadNgc.JOIN_PARAMETRO | DownloadNgc.JOIN_USUARIO;
      return join;
   }
   
   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      setarListaSituacao();
      setarListaTipoArquivo();
   }

   private void setarListaSituacao() throws R2Exception
   {
      this.listaSituacao = new ArrayList<DominioVo>();
      DominioVo dominioVo = new DominioVo();
      dominioVo.setNomeCampo(new Texto("DWNST"));
      dominioVo.setFlagAtivo(new Flag(YesNo.YES));
      
      List<DominioVo> lista = DominioNgc.getInstancia().pesquisar(dominioVo, 0);
      
      DominioVo vazio = new DominioVo();
      vazio.setNomeValor(new Texto(""));
      
      this.listaSituacao.add(vazio);
      this.listaSituacao.addAll(lista);
      
   }

   private void setarListaTipoArquivo() throws R2Exception
   {
      this.listaTipoArquivo = new ArrayList<DominioVo>();
      DominioVo dominioVo = new DominioVo();
      dominioVo.setNomeCampo(new Texto("DWNTPARQ"));
      dominioVo.setFlagAtivo(new Flag(YesNo.YES));
      
      List<DominioVo> lista = DominioNgc.getInstancia().pesquisar(dominioVo, 0);
      
      DominioVo vazio = new DominioVo();
      vazio.setNomeValor(new Texto(""));
      
      this.listaTipoArquivo.add(vazio);
      this.listaTipoArquivo.addAll(lista);
      
   }
   
   public void download(ActionEvent event)
   {
      JSFUtil util = new JSFUtil();
      try
      {
         if (getSelectedRowEntity() != null)
         {
            DownloadVo vo = getSelectedRowEntity();
            String caminho = vo.getParametroVo().getValor();
            String nomeArquivo = vo.getNomeArquivo().getValor();
            Download.gerarArquivo(getResponse(), caminho, nomeArquivo);

            FacesContext.getCurrentInstance().getApplication().getStateManager().saveView(FacesContext.getCurrentInstance());
            FacesContext.getCurrentInstance().responseComplete();
            
            
            this.alterarSituacaoArquivo(getSelectedRowEntity());
         }
      }
      catch (R2Exception oce)
      {
         FacesContext.getCurrentInstance().addMessage(null, 
               new FacesMessage(FacesMessage.SEVERITY_ERROR, util.getBundle().getString("erro.arquivo.nao.encontrado"), null));
      }
   }
   
   protected HttpServletResponse getResponse()
   {
      return (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
   }
   

   private void alterarSituacaoArquivo(DownloadVo downloadVo) throws R2Exception
   {
      downloadVo.setSituacao(new Inteiro(DownloadNgc.ST_BAIXADO));
      this.getBusiness().alterar(downloadVo);
   }

   public List<DominioVo> getListaSituacao()
   {
      return listaSituacao;
   }

   public void setListaSituacao(List<DominioVo> listaSituacao)
   {
      this.listaSituacao = listaSituacao;
   }

   public List<DominioVo> getListaTipoArquivo()
   {
      return listaTipoArquivo;
   }

   public void setListaTipoArquivo(List<DominioVo> listaTipoArquivo)
   {
      this.listaTipoArquivo = listaTipoArquivo;
   }
   
}